package secondkill.config;


import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import secondkill.pojo.TUser;
import secondkill.service.ITUserService;
import secondkill.utils.CookieUtil;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 自定义用户参数
 * @Auther  丁子川
 * @create 2022/1/19 13:06
 */
/*
1)@Component注解表明一个类会作为组件类，并告知Spring要为这个类创建bean，@Component（@Controller、@Service、@Repository）通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中。
2)@Bean注解告诉Spring这个方法将会返回一个对象，这个对象要注册为Spring应用上下文中的bean。通常方法体中包含了最终产生bean实例的逻辑，并且实例名就是方法名。
@Component和@Bean都是用来注册Bean并装配到Spring容器中，但是Bean比Component的自定义性更强。可以实现一些Component实现不了的自定义加载类
* */
@Component
@Slf4j
public class UserArgumentResolver implements HandlerMethodArgumentResolver {


    //条件的判断, 判断参数类型是不是用户，如果是就执行下面方法
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        Class<?> parameterType = methodParameter.getParameterType();
        return TUser.class == parameterType;
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer,
                                  NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) {
/*        //通过 WebRequest 来获得 HttpServletRequest, 以此来获得 getCookieValue 方法中的参数 Request
        HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
        //通过 WebRequest 来获得 HttpServletResponse, 以此来获得 getCookieValue 方法中的参数 Response
        HttpServletResponse response = nativeWebRequest.getNativeResponse(HttpServletResponse.class);*/
        return UserContext.getUser();
    }
}
